#include <errhandlingapi.h>
#include <handleapi.h>
#include <libloaderapi.h>
#include <memoryapi.h>
#include <minwinbase.h>
#include <minwindef.h>
#include <processthreadsapi.h>
#include <stdio.h>
#include <tlhelp32.h>
#include <unistd.h>
#include <windef.h>
#include <windows.h>
#include <winnt.h>
#include <winuser.h>
int handle;
DWORD getyzpid() {
  HWND hWnd = FindWindow("#32770", NULL);
  return GetWindowThreadProcessId(hWnd, NULL);
}
int handler(int handle) {
  switch (handle) {
  case 0:
    return 0;
  case 1:
    HWND hWnd = FindWindow("#32770", 0);
    ShowWindow(hWnd, 0);
    printf("已完成操作");
  case 2:
    MessageBox(NULL, "prompt", "BSFYZ", 0);
  }
}
int main() {
  system("chcp 65001");
  DWORD pid = getyzpid();
  printf("本程序使用了钩子注入dll，请根据引导使用\n");
  printf("请打开远志的关于页面，再运行本程序\n");
  HMODULE hdll = LoadLibraryA("a.dll");
  HOOKPROC mod = (HOOKPROC)GetProcAddress(hdll, "hookcall");
  HHOOK hook = SetWindowsHookEx(WH_KEYBOARD, mod, hdll, pid);
  printf("设置钩子成功(大概吧)\n");
  printf("------------SUCCED--------------\n");
  printf("请不要关闭本程序，程序需要继续运行\n");
  printf("接下来的输入不能有除有效数字以外的东西\n");
  printf("可以在关于页面按下F12以验证dll是否已经被注入\n");
  printf("------------操作-----------------\n");
  printf("0：结束注入,关闭程序\n");
  printf("1：隐藏关于窗口\n");
  printf("2：弹出一个提示弹窗\n");
  while (TRUE) {
    printf(">操作> ");
    scanf("%d", &handle);
    if (handle) {
      handler(handle);
    } else {
      return 0;
    }
  }
  return 1;
}
// 以下方案是不可用的
//
//  DWORD getyzpid() {
//    // char name[100] = "Yistart.exe";
//    char name[100] = "notepad.exe";
//    PROCESSENTRY32 p;
//    DWORD pid = -1;
//    HANDLE hp =
//        CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); // 创建当前进程快照
//    p.dwSize = sizeof(PROCESSENTRY32);                   // 初始化
//    Process32First(hp, &p);                              // 第一个进程
//    while (Process32Next(hp, &p)) {                      // 每次遍历一个
//      if (stricmp(p.szExeFile, name) == 0) {
//        printf("Process: %s (PID: %lu)\n", p.szExeFile, p.th32ProcessID);
//        pid = p.th32ProcessID;
//        break;
//      }
//    }
//    CloseHandle(hp);
//    return pid;
//  }
//
//  char *dllPath() {
//    char currdir[4096], fullpath[4096];
//    getcwd(currdir, 4096);
//    snprintf(fullpath, 4096, "%s\\%s", currdir, "a.dll");
//    return fullpath;
//  }
//  int main() {
//    DWORD pid = getyzpid();
//    HANDLE hWnd;
//    LPVOID LoadAddr =
//        (LPVOID)GetProcAddress(GetModuleHandle("kernel32.dll"),
//        "LoadLibraryA");
//
//    if (!LoadAddr) {
//      perror("Can't Load LoadLibrary");
//      return 1;
//    }
//
//    printf("DLLPath is %s\n", dllPath());
//    hWnd = OpenProcess(PROCESS_ALL_ACCESS, 0, pid);
//    if (!hWnd) {
//      perror("Can't Open Process");
//      return 1;
//    }
//    LPVOID startAddres =
//        VirtualAllocEx(hWnd, NULL, 4096, MEM_COMMIT, PAGE_READWRITE);
//    if (!startAddres) {
//      printf("Can't Create VirtualAddress:%lu", GetLastError());
//      return 1;
//    }
//    if (!WriteProcessMemory(hWnd, startAddres, dllPath(), 4096, NULL)) {
//      perror("Can't Write Memory");
//      return 1;
//    }
//    HANDLE hThread = CreateRemoteThread(
//        hWnd, NULL, 0, (LPTHREAD_START_ROUTINE)LoadAddr, startAddres, 0,
//        NULL);
//    if (!hThread) {
//      perror("Can't Create hThread");
//      return 1;
//    }
//    CloseHandle(hWnd);
//    return 0;
//  }
